import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path"; // 导入 path 模块
import viteCompression from "vite-plugin-compression";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import VueSetupExtend from "vite-plugin-vue-setup-extend";
export default defineConfig({
  minify: "terser",
  plugins: [
    vue(),
    viteCompression({
      verbose: true, // 在控制台显示压缩详情
      disable: false, // 启用插件
      threshold: 10240, // 仅压缩 >10KB 的文件
      algorithm: "gzip", // 使用 gzip 算法
      ext: ".gz", // 压缩文件扩展名
    }),
    AutoImport({
      // 这里除了引入 vue 以外还可以引入pinia、vue-router、vueuse等，
      imports: ["vue", "vue-router", "vuex"],
      // 第三方组件库的解析器
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      // dirs 指定组件所在位置，默认为 src/components
      // 可以让我们使用自己定义组件的时候免去 import 的麻烦
      dirs: ["src/components/"],
      // 配置需要将哪些后缀类型的文件进行自动按需引入
      extensions: ["vue"],
      // 解析的 UI 组件库，这里以 Element Plus 和 (Ant Design Vue 用AntDesignVueResolver())
      resolvers: [ElementPlusResolver()],
    }),
    VueSetupExtend(), //组件命名
  ],
  /**
   * 在生产中服务时的基本公共路径。
   * @default '/'
   */
  base: "./",
  resolve: {
    alias: {
      // 设置路径别名，例如将 '/@/' 映射到项目根目录
      "@": path.resolve(__dirname, "./src"), // 将 '@' 指向项目的 src 目录
    },
  },
  // 本地服务
  server: {
    open: false, // 是否自动在浏览器打开
    https: false, // 是否开启 https
    hmr: true, //开启热更新
    host: true, //是否开启局域网地址（同一局域网下可直接访问）
    port: 5173, // 自定义端口号为5173
    watch: {
      usePolling: true, // 修复HMR热更新失效
    },
    // 跨域代理配置
    proxy: {
      // 选项写法
      // "/api": {
      //   target: "https://bcnz.net/api/",
      //   changeOrigin: true,
      //   rewrite: (path) => path.replace(/^\/api/, ""),
      // },
      "/example": {
        target: "http://192.168.0.104:9010/",
        changeOrigin: true,
        rewrite: (path) => path,
      },
      "/record": {
        target: "http://192.168.0.104:9010/",
        changeOrigin: true,
        rewrite: (path) => path,
      },
      // 使用正则匹配所有以 /sys 开头的路径
      "^/sys.*": {
        target: "http://192.168.0.104:9010/", //本地(如果要改请搜索整个项目（其他地方也用到）)
        changeOrigin: true,
        rewrite: (path) => path,
        // 调试用
        configure: (proxy, options) => {
          proxy.on("proxyReq", (proxyReq, req, res) => {
            console.log("正在转发代理:", req.url);
          });
          proxy.on("proxyRes", (proxyRes, req, res) => {
            // console.log("[Proxy] 收到响应:", proxyRes.statusCode);
          });
        },
      },
    },
  },
  // 预热常用文件，提高初始页面加载速度
  warmup: {
    clientFiles: [
      "./src/layout/**/*.*", // 布局组件
      "./src/store/**/*.*", // 状态管理
      "./src/router/**/*.*", // 路由配置
      "./src/views/Home/indev.vue", // 首页
      "./src/views/Login/indev.vue", // 登录
      "./src/utils/axios.js", //  常用工具函数
      //  核心入口文件
      "./src/main.js",
      "./src/App.vue",
    ],
  },
  build: {
    terserOptions: {
      compress: {
        drop_console: true, // 生产环境取消 console
        drop_debugger: true,
      },
    },
    // chunkSizeWarningLimit: 1500,大文件报警阈值设置,不建议使用
    rollupOptions: {
      output: {
        //静态资源分类打包
        chunkFileNames: "static/js/[name]-[hash].js",
        entryFileNames: "static/js/[name]-[hash].js",
        assetFileNames: "static/[ext]/[name]-[hash].[ext]",
        manualChunks(id) {
          //静态资源分拆打包
          if (id.includes("node_modules")) {
            return id
              .toString()
              .split("node_modules/")[1]
              .split("/")[0]
              .toString();
          }
        },
      },
    },
  },
  css: {
    /* CSS 预处理器   导入全局样式*/
    preprocessorOptions: {
      scss: {
        api: "modern-compiler", // or 'modern'
        silenceDeprecations: ["legacy-js-api"],
        additionalData: '@use "src/styles/index.scss" as *;', //每个Vue组件都会自动导入
        // additionalData: '@import "src/styles/index.scss";',
        // implementation: require('sass').compile // 关键修复：强制使用新版 API
      },
    },
  },
});
